// 迭代器

// 迭代器（lterator）是一个函数或接口，为各种不同的数据结构提供一种访问机制。
// 任何数据接口只要部署 lterator 接口，就可完成办理操作。

// 1. es6 创造了一种新的遍历命令for...of 循环，lterator 接口主要提供for...of 消费

// 2. 原生具备iterator 接口的数据（可用for of 遍历）

//     a)Array
//     b)Arguments
//     c)Set
//     d)Map
//     e)String
//     f)typedArray
//     g)NodeList

// 3. 工作原理

//     a)创建一个指针对象，指向当前数据接口的起始位置
//     b)第一次调用对象的next方法，指针制动指向数据接口的第一个成员
//     c)接下来不断调用next方法，指针一直往后移动，直到指向最后一个成员
//     d)每调用next方法返回一个包含value（当前遍历的元素）和done（是否办理完毕，默认false没有遍历完）属性对象

// 自定义iterator迭代器

// 遍历以下对象，每次遍历输出obj.child 的每一项，并返回当前遍历状态
let obj = {
    name:'iterator',
    child:['li','wu','zhang','wang']
}

// 解：

let copyObj = {
    name:'iterator',
    child:['li','wu','zhang','wang'],
    [Symbol.iterator]:function(){
        let index = 0;  //指向当前数据接口的起始位置
        return { //创建一个指针对象
            next:()=>{  //对象的next方法
                //调用next方法返回一个包含value（当前遍历的元素）和done（是否办理完毕，默认false没有遍历完）属性对象
                if(index.length < this.child.length){
                    const element = {value:this.child[index],done:false}
                    index ++ ;
                    return element
                }else{
                    return {value:undefined,done:true}
                }
            }
        }
    }
}

for(let i of copyObj){
    console.log(i)
}

// > li
// > wu
// > zhang
// > wang